#pragma once

#include<iostream>
#include<cstring>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include"log.hpp"
#include"err.hpp"

//守护进程化
void Daemon()
{
    //守护进程(孤儿进程)：单独一个会话，是该会话的话首进程
    //1.不能是进程组的组长
    //2.需要忽略一些信号
    //3.更改启动路径
    //4.处理0,1,2号文件的输入输出

    //忽略信号
    signal(SIGPIPE,SIG_IGN);
    signal(SIGCHLD,SIG_IGN);

    //创建子进程，使子进程成为守护进程
    if(fork()>0)exit(0);//父进程

    //子进程
    pid_t ret=setsid();
    if((int)ret==-1)
    {
        logMessage(Fatal,"setsid error,code:%d,error string:%s",errno,strerror(errno));
        exit(DAEMON_ERR);
    }

    //处理输入输出
    int fd=open("/dev/null",O_RDWR);
    if(fd<0)
    {
        logMessage(Fatal,"open null error,code:%d,error string:%s",errno,strerror(errno));
        exit(OPEN_ERR);
    }

    dup2(fd,0);
    dup2(fd,1);
    dup2(fd,2);

    close(fd);
}
